{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "0d808c70",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['📋 表1：ban（封禁历史记录表）',\n",
       " 'user_id ：被封禁用户的编号',\n",
       " 'release_time ：解封时间（同时也是主键）',\n",
       " 'length_by_day ：封禁时长（以天为单位）',\n",
       " 'reason ：管理员填写的封禁理由',\n",
       " 'block ：封禁的区块（枚举值：forum, errand），默认为 forum',\n",
       " '📋 表2：blog（博客/帖子表）',\n",
       " 'creator ：发帖用户编号（外键引用 user.id）',\n",
       " 'id ：帖子唯一标识（主键）',\n",
       " 'title ：帖子标题（最大长度50）',\n",
       " 'content ：帖子内容',\n",
       " 'send_time ：发布时间，默认为当前时间',\n",
       " 'visibility ：可见性（枚举值：admin, sender, visible），默认为 visible',\n",
       " '📋 表3：charge（充值记录表）',\n",
       " 'user_id ：充值用户编号',\n",
       " 'id ：充值记录唯一标识（主键）',\n",
       " 'charge_time ：充值时间',\n",
       " 'amount ：充值金额',\n",
       " '📋 表4：complaint（投诉记录表）',\n",
       " 'id ：投诉记录唯一标识（主键）',\n",
       " 'sender_id ：投诉人编号',\n",
       " 'title ：投诉标题（可为空）',\n",
       " 'description ：投诉描述',\n",
       " 'complaint_block ：投诉对象类型（枚举值：FORUM_BLOG, FORUM_REPLY, SHOP, ERRAND）',\n",
       " 'complained_id ：被投诉对象编号',\n",
       " 'result ：处理结果（可为空）',\n",
       " '📋 表5：errand（跑腿任务表）',\n",
       " 'id ：任务编号（主键）',\n",
       " 'sender_id ：发布者编号（外键引用 user.id）',\n",
       " 'title ：任务标题（最大长度20）',\n",
       " 'errand_description ：任务描述',\n",
       " 'fee ：报酬金额',\n",
       " 'start_location ：起点位置',\n",
       " 'end_location ：终点位置',\n",
       " 'latest_arrival_time ：最晚送达时间',\n",
       " 'acceptor_id ：接单人编号（可为空）（外键引用 user.id）',\n",
       " 'status ：任务状态（枚举值：NORMAL, COMPLETED, CONFIRMED, AUTO_CONFIRMED, EXPIRED, CANCELLED），默认为 NORMAL',\n",
       " '📋 表6：error（错误日志表）',\n",
       " 'id ：错误日志编号（主键、自增）',\n",
       " 'content ：错误信息内容',\n",
       " '📋 表7：good（商品表）',\n",
       " 'id ：商品编号（主键）',\n",
       " 'name ：商品名称',\n",
       " 'description ：商品描述（可为空）',\n",
       " 'shop ：所属店铺名称（外键引用 shop.name）',\n",
       " 'price ：商品价格',\n",
       " '📋 表8：good_transaction（商品交易记录表）',\n",
       " 'id ：交易编号（主键）',\n",
       " 'good_id ：商品编号（外键引用 good.id）',\n",
       " 'amount ：交易数量',\n",
       " 'order_id ：订单编号（可为空，若为空表示是商家补货）',\n",
       " 'time ：交易时间',\n",
       " '📋 表9：like_blog（点赞记录表）',\n",
       " 'blog_id ：被点赞的帖子编号（外键引用 blog.id）',\n",
       " 'liker ：点赞用户编号（外键引用 user.id）',\n",
       " 'like_time ：点赞时间，默认为当前时间',\n",
       " '主键为 (blog_id, liker) 联合主键',\n",
       " '📋 表10：main_page_blog（首页展示博客视图）',\n",
       " '注：这是一个视图（view），不是真实表 ',\n",
       " '',\n",
       " 'title ：帖子标题',\n",
       " 'content ：帖子内容',\n",
       " 'creator ：作者编号',\n",
       " 'liker_count ：点赞人数',\n",
       " '📋 表11：reply（评论表）',\n",
       " 'id ：评论编号（主键、自增）',\n",
       " 'blog_id ：关联的帖子编号（外键引用 blog.id）',\n",
       " 'sender ：评论人编号（外键引用 user.id）',\n",
       " 'content ：评论内容',\n",
       " 'send_time ：评论时间，默认为当前时间',\n",
       " 'parent_id ：父评论ID（为空则表示是一级评论）',\n",
       " '📋 表12：session_management（会话管理视图）',\n",
       " '注：这也是一个视图（view） ',\n",
       " '',\n",
       " 'PRIMARY_ID ：主键标识',\n",
       " 'SESSION_ID ：会话ID',\n",
       " 'CREATION_TIME_HR ：创建时间',\n",
       " 'LAST_ACCESS_TIME_HR ：最后访问时间',\n",
       " 'MAX_INACTIVE_INTERVAL ：最大不活跃间隔',\n",
       " 'EXPIRY_TIME_HR ：过期时间',\n",
       " 'PRINCIPAL_NAME ：用户名',\n",
       " '📋 表13：shop（店铺表）',\n",
       " 'name ：店铺名称（主键）',\n",
       " 'description ：店铺描述（可为空）',\n",
       " 'password ：店铺密码（登录使用）',\n",
       " '📋 表14：shop_order（店铺订单表）',\n",
       " 'id ：订单编号（主键）',\n",
       " 'shopper_id ：下单用户编号（外键引用 user.id）',\n",
       " 'shop ：所属店铺名称（外键引用 shop.name）',\n",
       " '📋 表15：user（用户表）',\n",
       " 'id ：用户编号（主键）',\n",
       " 'name ：用户名字',\n",
       " 'phone_number ：手机号（11位）',\n",
       " 'balance ：账户余额，默认为 0']"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fp=open(\"1.txt\")\n",
    "raw=fp.read()\n",
    "raw_lines=raw.split(\"\\n\")\n",
    "fp.close()\n",
    "raw_lines"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "a5d635c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "omitting {'name': {'number': 6, 'name': '错误日志表'}, 'value': [{'name': 'id ', 'value': '错误日志编号（主键、自增）'}, {'name': 'content ', 'value': '错误信息内容'}]}\n",
      "omitting {'name': {'number': 9, 'name': '首页展示博客视图'}, 'value': [{'name': '注', 'value': '这是一个视图（view），不是真实表 '}, {'name': '', 'value': ''}, {'name': 'title ', 'value': '帖子标题'}, {'name': 'content ', 'value': '帖子内容'}, {'name': 'creator ', 'value': '作者编号'}, {'name': 'liker_count ', 'value': '点赞人数'}]}\n",
      "omitting {'name': {'number': 10, 'name': '会话管理视图'}, 'value': [{'name': '注', 'value': '这也是一个视图（view） '}, {'name': '', 'value': ''}, {'name': 'PRIMARY_ID ', 'value': '主键标识'}, {'name': 'SESSION_ID ', 'value': '会话ID'}, {'name': 'CREATION_TIME_HR ', 'value': '创建时间'}, {'name': 'LAST_ACCESS_TIME_HR ', 'value': '最后访问时间'}, {'name': 'MAX_INACTIVE_INTERVAL ', 'value': '最大不活跃间隔'}, {'name': 'EXPIRY_TIME_HR ', 'value': '过期时间'}, {'name': 'PRINCIPAL_NAME ', 'value': '用户名'}]}\n"
     ]
    }
   ],
   "source": [
    "total=[]\n",
    "table_info={}\n",
    "index=0\n",
    "for l in raw_lines:\n",
    "    if('📋' in l):\n",
    "        if len(table_info.keys())\\\n",
    "            and\\\n",
    "            (\n",
    "            '视图' in table_info['name']['name'] \\\n",
    "            or '错误' in table_info['name']['name'] \\\n",
    "                or '异常' in table_info['name']['name']):\n",
    "            # pass\n",
    "            print(f\"omitting {table_info}\")\n",
    "        else:\n",
    "            total.append(table_info)\n",
    "            index+=1\n",
    "        table_info={}\n",
    "        table_info['name']={}\n",
    "        table_info['name']['number']=index\n",
    "        \n",
    "        table_info['name']['name']=l.split(\"（\")[1].split(\"）\")[0]\n",
    "        table_info['value']=[]\n",
    "        # print(total)\n",
    "    else:\n",
    "        col_info={}\n",
    "        splits=l.split('：')\n",
    "        # if len(splits) !=2:\n",
    "        #     print(f\"{len(splits)}--Error: \",l)\n",
    "        #     continue\n",
    "        col_info['name']=splits[0]\n",
    "        col_info['value']=\"\".join(splits[1:])\n",
    "        table_info['value'].append(col_info)\n",
    "        \n",
    "total.append(table_info)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "702c3704",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{},\n",
       " {'name': {'number': 1, 'name': '封禁历史记录表'},\n",
       "  'value': [{'name': 'user_id ', 'value': '被封禁用户的编号'},\n",
       "   {'name': 'release_time ', 'value': '解封时间（同时也是主键）'},\n",
       "   {'name': 'length_by_day ', 'value': '封禁时长（以天为单位）'},\n",
       "   {'name': 'reason ', 'value': '管理员填写的封禁理由'},\n",
       "   {'name': 'block ', 'value': '封禁的区块（枚举值forum, errand），默认为 forum'}]},\n",
       " {'name': {'number': 2, 'name': '博客/帖子表'},\n",
       "  'value': [{'name': 'creator ', 'value': '发帖用户编号（外键引用 user.id）'},\n",
       "   {'name': 'id ', 'value': '帖子唯一标识（主键）'},\n",
       "   {'name': 'title ', 'value': '帖子标题（最大长度50）'},\n",
       "   {'name': 'content ', 'value': '帖子内容'},\n",
       "   {'name': 'send_time ', 'value': '发布时间，默认为当前时间'},\n",
       "   {'name': 'visibility ',\n",
       "    'value': '可见性（枚举值admin, sender, visible），默认为 visible'}]},\n",
       " {'name': {'number': 3, 'name': '充值记录表'},\n",
       "  'value': [{'name': 'user_id ', 'value': '充值用户编号'},\n",
       "   {'name': 'id ', 'value': '充值记录唯一标识（主键）'},\n",
       "   {'name': 'charge_time ', 'value': '充值时间'},\n",
       "   {'name': 'amount ', 'value': '充值金额'}]},\n",
       " {'name': {'number': 4, 'name': '投诉记录表'},\n",
       "  'value': [{'name': 'id ', 'value': '投诉记录唯一标识（主键）'},\n",
       "   {'name': 'sender_id ', 'value': '投诉人编号'},\n",
       "   {'name': 'title ', 'value': '投诉标题（可为空）'},\n",
       "   {'name': 'description ', 'value': '投诉描述'},\n",
       "   {'name': 'complaint_block ',\n",
       "    'value': '投诉对象类型（枚举值FORUM_BLOG, FORUM_REPLY, SHOP, ERRAND）'},\n",
       "   {'name': 'complained_id ', 'value': '被投诉对象编号'},\n",
       "   {'name': 'result ', 'value': '处理结果（可为空）'}]},\n",
       " {'name': {'number': 5, 'name': '跑腿任务表'},\n",
       "  'value': [{'name': 'id ', 'value': '任务编号（主键）'},\n",
       "   {'name': 'sender_id ', 'value': '发布者编号（外键引用 user.id）'},\n",
       "   {'name': 'title ', 'value': '任务标题（最大长度20）'},\n",
       "   {'name': 'errand_description ', 'value': '任务描述'},\n",
       "   {'name': 'fee ', 'value': '报酬金额'},\n",
       "   {'name': 'start_location ', 'value': '起点位置'},\n",
       "   {'name': 'end_location ', 'value': '终点位置'},\n",
       "   {'name': 'latest_arrival_time ', 'value': '最晚送达时间'},\n",
       "   {'name': 'acceptor_id ', 'value': '接单人编号（可为空）（外键引用 user.id）'},\n",
       "   {'name': 'status ',\n",
       "    'value': '任务状态（枚举值NORMAL, COMPLETED, CONFIRMED, AUTO_CONFIRMED, EXPIRED, CANCELLED），默认为 NORMAL'}]},\n",
       " {'name': {'number': 6, 'name': '商品表'},\n",
       "  'value': [{'name': 'id ', 'value': '商品编号（主键）'},\n",
       "   {'name': 'name ', 'value': '商品名称'},\n",
       "   {'name': 'description ', 'value': '商品描述（可为空）'},\n",
       "   {'name': 'shop ', 'value': '所属店铺名称（外键引用 shop.name）'},\n",
       "   {'name': 'price ', 'value': '商品价格'}]},\n",
       " {'name': {'number': 7, 'name': '商品交易记录表'},\n",
       "  'value': [{'name': 'id ', 'value': '交易编号（主键）'},\n",
       "   {'name': 'good_id ', 'value': '商品编号（外键引用 good.id）'},\n",
       "   {'name': 'amount ', 'value': '交易数量'},\n",
       "   {'name': 'order_id ', 'value': '订单编号（可为空，若为空表示是商家补货）'},\n",
       "   {'name': 'time ', 'value': '交易时间'}]},\n",
       " {'name': {'number': 8, 'name': '点赞记录表'},\n",
       "  'value': [{'name': 'blog_id ', 'value': '被点赞的帖子编号（外键引用 blog.id）'},\n",
       "   {'name': 'liker ', 'value': '点赞用户编号（外键引用 user.id）'},\n",
       "   {'name': 'like_time ', 'value': '点赞时间，默认为当前时间'},\n",
       "   {'name': '主键为 (blog_id, liker) 联合主键', 'value': ''}]},\n",
       " {'name': {'number': 9, 'name': '评论表'},\n",
       "  'value': [{'name': 'id ', 'value': '评论编号（主键、自增）'},\n",
       "   {'name': 'blog_id ', 'value': '关联的帖子编号（外键引用 blog.id）'},\n",
       "   {'name': 'sender ', 'value': '评论人编号（外键引用 user.id）'},\n",
       "   {'name': 'content ', 'value': '评论内容'},\n",
       "   {'name': 'send_time ', 'value': '评论时间，默认为当前时间'},\n",
       "   {'name': 'parent_id ', 'value': '父评论ID（为空则表示是一级评论）'}]},\n",
       " {'name': {'number': 10, 'name': '店铺表'},\n",
       "  'value': [{'name': 'name ', 'value': '店铺名称（主键）'},\n",
       "   {'name': 'description ', 'value': '店铺描述（可为空）'},\n",
       "   {'name': 'password ', 'value': '店铺密码（登录使用）'}]},\n",
       " {'name': {'number': 11, 'name': '店铺订单表'},\n",
       "  'value': [{'name': 'id ', 'value': '订单编号（主键）'},\n",
       "   {'name': 'shopper_id ', 'value': '下单用户编号（外键引用 user.id）'},\n",
       "   {'name': 'shop ', 'value': '所属店铺名称（外键引用 shop.name）'}]},\n",
       " {'name': {'number': 12, 'name': '用户表'},\n",
       "  'value': [{'name': 'id ', 'value': '用户编号（主键）'},\n",
       "   {'name': 'name ', 'value': '用户名字'},\n",
       "   {'name': 'phone_number ', 'value': '手机号（11位）'},\n",
       "   {'name': 'balance ', 'value': '账户余额，默认为 0'}]}]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "5efe4827",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\\t\\t表1：封禁历史记录表\\n\\n表1为封禁历史记录表，\\n其中user_id 为被封禁用户的编号，release_time 为解封时间（同时也是主键），length_by_day 为封禁时长（以天为单位），reason 为管理员填写的封禁理由，block 为封禁的区块（枚举值forum, errand），默认为 forum。\\n\\n\\t\\t表2：博客/帖子表\\n\\n表2为博客/帖子表，\\n其中creator 为发帖用户编号（外键引用 user.id），id 为帖子唯一标识（主键），title 为帖子标题（最大长度50），content 为帖子内容，send_time 为发布时间，默认为当前时间，visibility 为可见性（枚举值admin, sender, visible），默认为 visible。\\n\\n\\t\\t表3：充值记录表\\n\\n表3为充值记录表，\\n其中user_id 为充值用户编号，id 为充值记录唯一标识（主键），charge_time 为充值时间，amount 为充值金额。\\n\\n\\t\\t表4：投诉记录表\\n\\n表4为投诉记录表，\\n其中id 为投诉记录唯一标识（主键），sender_id 为投诉人编号，title 为投诉标题（可为空），description 为投诉描述，complaint_block 为投诉对象类型（枚举值FORUM_BLOG, FORUM_REPLY, SHOP, ERRAND），complained_id 为被投诉对象编号，result 为处理结果（可为空）。\\n\\n\\t\\t表5：跑腿任务表\\n\\n表5为跑腿任务表，\\n其中id 为任务编号（主键），sender_id 为发布者编号（外键引用 user.id），title 为任务标题（最大长度20），errand_description 为任务描述，fee 为报酬金额，start_location 为起点位置，end_location 为终点位置，latest_arrival_time 为最晚送达时间，acceptor_id 为接单人编号（可为空）（外键引用 user.id），status 为任务状态（枚举值NORMAL, COMPLETED, CONFIRMED, AUTO_CONFIRMED, EXPIRED, CANCELLED），默认为 NORMAL。\\n\\n\\t\\t表6：商品表\\n\\n表6为商品表，\\n其中id 为商品编号（主键），name 为商品名称，description 为商品描述（可为空），shop 为所属店铺名称（外键引用 shop.name），price 为商品价格。\\n\\n\\t\\t表7：商品交易记录表\\n\\n表7为商品交易记录表，\\n其中id 为交易编号（主键），good_id 为商品编号（外键引用 good.id），amount 为交易数量，order_id 为订单编号（可为空，若为空表示是商家补货），time 为交易时间。\\n\\n\\t\\t表8：点赞记录表\\n\\n表8为点赞记录表，\\n其中blog_id 为被点赞的帖子编号（外键引用 blog.id），liker 为点赞用户编号（外键引用 user.id），like_time 为点赞时间，默认为当前时间，主键为 (blog_id, liker) 联合主键为。\\n\\n\\t\\t表9：评论表\\n\\n表9为评论表，\\n其中id 为评论编号（主键、自增），blog_id 为关联的帖子编号（外键引用 blog.id），sender 为评论人编号（外键引用 user.id），content 为评论内容，send_time 为评论时间，默认为当前时间，parent_id 为父评论ID（为空则表示是一级评论）。\\n\\n\\t\\t表10：店铺表\\n\\n表10为店铺表，\\n其中name 为店铺名称（主键），description 为店铺描述（可为空），password 为店铺密码（登录使用）。\\n\\n\\t\\t表11：店铺订单表\\n\\n表11为店铺订单表，\\n其中id 为订单编号（主键），shopper_id 为下单用户编号（外键引用 user.id），shop 为所属店铺名称（外键引用 shop.name）。\\n\\n\\t\\t表12：用户表\\n\\n表12为用户表，\\n其中id 为用户编号（主键），name 为用户名字，phone_number 为手机号（11位），balance 为账户余额，默认为 0。\\n\\n'"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out_buf=\"\"\n",
    "for table in total:\n",
    "    if(len(table.keys())==0):\n",
    "        continue\n",
    "    out_buf+=f\"\\t\\t表{table['name']['number']}：{table['name']['name']}\\n\"\n",
    "    out_buf+=f\"\\n表{table['name']['number']}为{table['name']['name']}，\\n其中\"\n",
    "    for i,col in enumerate(table['value']):\n",
    "        out_buf+=col['name']+\"为\"+col['value']+(\"，\" if i!=len(table['value'])-1 else \"。\")\n",
    "    out_buf+=\"\\n\\n\"\n",
    "out_buf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3de851a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "fp=open(\"2.txt\",\"w\")\n",
    "fp.write(out_buf)\n",
    "fp.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pip_main",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
